﻿/**
 * 提供场景功能，如：同样一个表单，可以有两个不同的场景：添加和删除。
 * 说白了就是策略模式。
 * 
 */
Ext.define('Happy.mixin.Sceneable', {
    /**
     * @cfg 是否启用场景，为了提高效率，默认不启用场景。
     *
     */
    enableScene: false,

    /**
     * 初始化场景，被掺入的目标类型在构造方法中必须调用此方法。
     * 
     * @param {Object|String} scene
     */
    initScene: function (scene) {
        var me = this;

        if (Ext.isString(scene)) {
            me.scene = Ext.create(scene);
        }
        else {
            me.scene = scene;
        }
    },

    /**
     * 调用场景的指定方法。
     * 
     * @param {String} method
     */
    callScene: function (method, args) {
        var me = this;

        if (me.enableScene === false) {
            return;
        }
        if (!me.scene) {
            return;
        }

        if (!me.scene[method]) {
            return;
        }

        return me.scene[method].apply(me, Array.prototype.concat.apply([me], args));
    }
});